package xyz.lwm.lazycat.beans;

import xyz.lwm.lazycat.annotation.Inject;
import xyz.lwm.lazycat.utility.reflect.Annotations;

/**
 * BeanDesign
 *
 * @author lwm
 */
public interface BeanDesign<T> {

    /**
     * bean name
     */
    void setName(String name);

    /**
     * bean name, may be empty
     */
    String getName();

    /**
     * bean type
     */
    Class<T> getType();

    /**
     * bean order
     */
    int getOrder();

    /**
     * bean annotations, may be empty but not null
     */
    Annotations getAnnotations();

    /**
     * bean executable (method or constructor)
     */
    Instantiable getInstantiable();

    /**
     * bean depends on, may be empty
     */
    Dependency[] getDependsOn();

    /**
     * bean injections, may be empty
     *
     * @see Inject
     */
    Injection[] getInjections();

    /**
     * bean conditions, may be empty
     */
    Condition[] getConditions();

}
